// 导入用户服务模块
const userService = require("../service/userService");
const bcrypt = require("bcryptjs");
const jwtHelper = require("../middleware/jwt/token");
const sendCodeService = require("../middleware/verification");
const verificationCodes = {}; // 存储验证码及其发送时间
// 用户登录
const login = async (req, res) => {
  try {
    // 获取用户名和密码
    const {
      email,
      password
    } = req.body;
    // 调用登录服务
    const user = await userService.loginService(email);
    // 判断用户是否存在
    if (!user) {
      return res.status(400).send("用户不存在");
    }
    // 比较密码
    const isMatch = await bcrypt.compare(password, user.password);
    if (!isMatch) {
      return res.status(400).send("密码错误");
    }
    // // 生成token
    const token = jwtHelper.generateToken(user);
    console.log(token, "token");
    const userInfo = {
      code: 200,
      message: "登录成功",
      token,
      user: {
        id: user.id,
        username: user.username,
        email: user.email,
      },
    };
    res.status(200).send(userInfo);
  } catch (error) {
    res.status(500).send(error.message);
  }
};
// 用户注册
const register = async (req, res) => {
  try {
    // 检查用户表是否存在
    const [isCheckUsers] = await userService.checkTableService();
    const tableExists = isCheckUsers[0]["COUNT(*)"] > 0;
    if (!tableExists) {
      // 若不存在，则创建用户表
      await userService.ensureUsersService();
    }
    const {
      username,
      email,
      phone_number,
      password
    } = req.body;
    const isUsername = await userService.isUsernameTaken(username);
    console.log(isUsername, "isUsername");
    const isEmail = await userService.isEmailTaken(email);
    if (tableExists && isUsername) {
      return res.status(400).send("用户名已存在，请选择其他用户名");
    }

    if (tableExists && isEmail) {
      return res.status(400).send("电子邮件地址已注册，请使用其他电子邮件地址");
    }
    // 调用用户服务模块的注册方法
    const [result] = await userService.registerService(
      username,
      email,
      phone_number,
      password
    );
    // 检查插入结果
    if (result.affectedRows === 1) {
      res.status(200).send({
        code: 200,
        message: "注册成功",
      });
    } else {
      res.status(500).send("插入数据库时发生错误");
    }
  } catch (error) {
    res.status(500).send(error.message);
  }
};

// 手机验证码
const sendCode = async (req, res) => {
  try {
    const {
      phone_number
    } = req.body;
    // 简单手机号格式验证（以中国大陆的手机号为例）
    const phoneRegex = /^1[3-9]\d{9}$/;

    if (!phoneRegex.test(phone_number)) {
      return res.status(400).send({
        code: 400,
        message: "无效的手机号格式",
      });
    }
    // 检查是否已经发送过验证码且在1分钟内
    if (verificationCodes[phone_number] && Date.now() - verificationCodes[phone_number].expiry < 0) {
      return res.status(429).send({
        code: 429,
        message: "一分钟内只能发送一次验证码",
      });
    }
    // 生成验证码
    const verifyCode = sendCodeService.generateVerificationCode();
    // 调用用户服务模块的发送验证码方法
    verificationCodes[phone_number] = {
      code: verifyCode,
      expiry: Date.now() + 1 * 60 * 1000 // 1分钟过期
    };
    const result = await sendCodeService.sendSMS(phone_number, verifyCode);
    // 检查发送结果
    if (result) {
      res.status(200).send({
        code: 200,
        verifyCode,
        message: "验证码发送成功",
      });
    }
  } catch (error) {
    res.status(500).send(error.message);
  }
};
// 手机验证码登录
const verifyCodeLogin = (req, res) => {
  try {
    const {
      phone_number,
      code
    } = req.body;

    // 检查验证码是否存在且未过期
    if (verificationCodes[phone_number] && verificationCodes[phone_number].expiry > Date.now()) {
      // 检查验证码是否正确
      if (verificationCodes[phone_number].code === code) {
        // 验证通过，登录成功
        res.status(200).send({
          code: 200,
          message: "登录成功",
        });

        // 清除已使用的验证码
        delete verificationCodes[phone_number];
      } else {
        // 验证码错误
        res.status(401).send({
          code: 401,
          message: "验证码错误",
        });
      }
    } else {
      // 验证码不存在或已过期
      res.status(410).send({
        code: 410,
        message: "验证码已过期",
      });
    }
  } catch (error) {
    res.status(500).send({
      code: 500,
      message: error.message,
    });
  }
};

// 修改密码
const changePassword = async (req, res) => {
  try {
    const {
      email,
      password
    } = req.body;
    // 校验邮箱
    const isEmail = await userService.isEmailTaken(email);
    if (!isEmail) {
      return res.status(400).send("用户不存在");
    }
    // 调用用户服务模块的修改密码方法
    const result = await userService.updatePasswordService(
      email,
      password
    );
    // 检查修改结果
    if (result.affectedRows === 1) {
      res.status(200).send({
        code: 200,
        message: "密码修改成功"
      });
    }
  } catch (error) {
    res.status(500).send(error.message);
  }
}


module.exports = {
  register,
  login,
  sendCode,
  verifyCodeLogin,
  changePassword
};